﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using DAL.Model;
using DAL.Persistence;
using System.Data.SqlClient;
using System.Data;

namespace DAL.Persistence
{
    /// <summary>
    /// Classe responsável pelas transações de categorias no banco de dados
    /// </summary>
    public class CategoriaDAL : DAL
    {
        /// <summary>
        /// Método para cadastrar uma categoria no banco
        /// </summary>
        /// <param name="c">A categoria a ser cadastrada</param>
        /// <returns>Uma string com o status da operação</returns>
        public string Salvar(Categoria c)
        {
            try
            {
                AbrirConexao();

                comando = new SqlCommand("CadastrarCategoria", conexao);
                comando.CommandType = CommandType.StoredProcedure;

                comando.Parameters.AddWithValue("@Nome", c.Nome);
                comando.Parameters.AddWithValue("@Descricao", c.Descricao);

                if (comando.ExecuteNonQuery() > 0)
                    return "Categoria cadastrada com sucesso";
                else
                    throw new Exception("Erro ao cadastrar categoria");
            }
            catch (SqlException ex)
            {
                return ex.Message;
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
            finally
            {
                FecharConexao();
            }
        }

        /// <summary>
        /// Lista todos as categorias do banco de dados
        /// </summary>
        /// <returns>Retorna uma lista de objetos categorias</returns>
        public List<Categoria> Listar()
        {
            try
            {
                AbrirConexao();

                comando = new SqlCommand("ConsultarCategoria", conexao);
                comando.CommandType = CommandType.StoredProcedure;

                dr = comando.ExecuteReader(); //Dispara a Consulta e armazena no DataReader

                List<Categoria> listaDeCategorias = new List<Categoria>();

                //percorrer o DataReader
                while(dr.Read()) //Leitura de cada registro contido no DataReader
                {
                    Categoria c = new Categoria();

                    //Ler os campos do banco para dentro do objeto Categoria
                    c.IdCategoria = Convert.ToInt32(dr["CODIGO"]);
                    c.Nome = Convert.ToString(dr["NOME"]);
                    c.Descricao = Convert.ToString(dr["DESCRICAO"]);

                    listaDeCategorias.Add(c);
                }

                return listaDeCategorias;
            }
            catch
            {
                return null;
            }
            finally
            {
                FecharConexao();
            }
        }

        /// <summary>
        /// Retorna uma categoria do banco de dados baseado na ID
        /// </summary>
        /// <param name="IdCategoria">O ID da categoria</param>
        /// <returns>A categoria</returns>
        public Categoria ConsultaCategoriaPorID(int IdCategoria)
        {
            try
            {
                AbrirConexao();

                comando = new SqlCommand("ConsultarCategoriaPorID", conexao);
                comando.CommandType = CommandType.StoredProcedure;

                dr = comando.ExecuteReader(); //Disparo a Consulta e armazeno no DataReader               

                Categoria c = null;
                //percorrer o DataReader
                while (dr.Read()) //Leitura de cada registro contido no DataReader
                {
                    c = new Categoria();

                    //Ler os campos do banco para dentro do objeto Categoria
                    c.IdCategoria = Convert.ToInt32(dr["CODIGO"]);
                    c.Nome = Convert.ToString(dr["NOME"]);
                    c.Descricao = Convert.ToString(dr["DESCRICAO"]);
                }

                return c;

            }
            catch (SqlException ex)
            {
                throw ex;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                FecharConexao();
            }
        }   

        /// <summary>
        /// Atualiza uma categoria do banco de dados
        /// </summary>
        /// <param name="c">A categoria a ser alterada</param>
        /// <returns>Uma string com o status da operação</returns>
        public string Atualizar(Categoria c)
        {
            try
            {
                AbrirConexao();

                comando = new SqlCommand("AtualizarCategoria", conexao);
                comando.CommandType = CommandType.StoredProcedure;

                comando.Parameters.AddWithValue("@IdCategoria", c.IdCategoria);
                comando.Parameters.AddWithValue("@Nome", c.Nome);
                comando.Parameters.AddWithValue("@Descricao", c.Descricao);

                if (comando.ExecuteNonQuery() > 0)
                    return "Categoria atualizada com sucesso";
                else
                    throw new Exception("Erro. Categoria nao localizada");
            }
            catch (Exception e)
            {
                return e.Message;
            }
            finally
            {
                FecharConexao();
            }
        }

        /// <summary>
        /// Exclui a categoria do banco, usando o ID
        /// </summary>
        /// <param name="IdCategoria">O ID da categoria a ser excluido</param>
        /// <returns>Uma mensagem com o status da operação</returns>
        public string Excluir(int IdCategoria)
        {
            try
            {
                AbrirConexao();

                comando = new SqlCommand("ExcluirCategoria", conexao);
                comando.CommandType = CommandType.StoredProcedure;

                comando.Parameters.AddWithValue("@IdCategoria", IdCategoria);

                if (comando.ExecuteNonQuery() > 0)
                    return "Categoria excluída com sucesso";
                else
                    throw new Exception("Erro. Categoria nao localizada");
            }
            catch (Exception e)
            {
                return e.Message;
            }
            finally
            {
                FecharConexao();
            }
        }
    }
}